package com.xajh.duoduo.impl.process;

import com.xajh.duoduo.abs.AbsProcessor;
import com.xajh.duoduo.environment.CurrentAccountPosition;
import com.xajh.duoduo.environment.CurrentRolePosition;
import com.xajh.duoduo.eunm.position.*;
import com.xajh.duoduo.eunm.process.ProcessEnum;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.awt.event.InputEvent;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 换账号
 */
@Service
public class TransAccountProcessor extends AbsProcessor implements InitializingBean {
    //系统位
    private final SystemPosition[] systemPositions = SystemPosition.values();
    //设置位
    private final SystemPosition.SettingPosition[] settingPositions = SystemPosition.SettingPosition.values();
    //切换角色位
    private final SystemPosition.SettingPosition.TransAccountPosition[] transAccountPositions = SystemPosition.SettingPosition.TransAccountPosition.values();
    //点击 切换角色/切换账号 后弹窗的确认按钮
    private final SystemPosition.SettingPosition.VerifyPosition[] verifyPositions = SystemPosition.SettingPosition.VerifyPosition.values();
    // 角色位
    private final RolePosition[] rolePositions = RolePosition.values();
    // 首页进入江湖位
    private final JoinGameHome[] joinGameHomes = JoinGameHome.values();
    // 角色页进入江湖位
    private final JoinGameRole[] joinGameRoles = JoinGameRole.values();
    //空白位
    private final BlankPosition[] blankPositions = BlankPosition.values();
    //进入游戏后活动弹窗的关闭位置
    private final ActivityClosePosition[] activityClosePositions = ActivityClosePosition.values();
    //首页切换账号后的登录按钮
    private final AccountLoginPosition[] accountLoginPositions = AccountLoginPosition.values();
    //弹出的江湖告示的关闭按钮首页
    private final SocialNoticeClosePosition[] socialNoticeClosePositions = SocialNoticeClosePosition.values();

    @Override
    public boolean process() throws Exception{
        Robot robot = new Robot();
        robot.setAutoWaitForIdle(true);
        //开始流程
        //点击空白界面，防止游戏处于省电状态
        for(int i = 0 ; i < systemPositions.length ; i++){
            clickBlankPosition(robot,i);
        }

        for(int i = 0 ; i < systemPositions.length ; i++){
            /**选择多开窗口*/
//            checkMenu(robot,i);
            /**点击系统位*/
            clickSystemPositon(robot,i);
            /**点击设置位*/
            clickSettingPosition(robot,i);
            /**点击切换角色位*/
            clickTransAccountPosition(robot,i);
            /**点击弹窗的确认键*/
            clickVerifyBotton(robot,i);
        }

        //切换角色 读条停顿2分钟
        Thread.sleep(3 * 60 * 1000);

        for(int i = 0 ; i < systemPositions.length ; i++){
            /**选择下一个账号*/
            AccountPosition nextAccountPosition = pickNextAndSetCurrentAccount(CurrentAccountPosition.getCurrentAccountPosition());
            //如果为null，已经是最后一个account了
            if(nextAccountPosition != null){
                /**点击账号下拉菜单*/
                clickAccountMenu(robot,i);
                /**选择下一个账号*/
                clickNextAccount(robot,nextAccountPosition);
                /**点击登录位*/
                clickAccountLogin(robot,i);
                //等待加载信息
                Thread.sleep(60 * 1000);
                /**点击江湖告示关闭位*/
                clickSocialNoticeClose(robot,i);
                /**点击进入江湖为*/
                clickJoinGameHome(robot,i);
            }else {
                return false;
            }

        }
        //进入游戏 读条停顿2分钟
        Thread.sleep(3 * 60 * 1000);

        //选择第一个角色
        for(int i = 0 ; i < systemPositions.length ; i++){
            clickFirstRole(robot,i);
        }
        //角色界面 进入江湖
        for(int i = 0 ; i < systemPositions.length ; i++){
            clickJoinGameRole(robot,i);
        }
        //进入游戏 读条停顿2分钟
        Thread.sleep(3 * 60 * 1000);

        //进入游戏后，关闭活动弹窗
        //循环点击5次
        for (int j = 0 ; j < 5 ; j++){
            for(int i = 0 ; i < systemPositions.length ; i++){
                clickActivityClose(robot,i);
            }
        }

        return true;
    }

    private void clickSocialNoticeClose(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(socialNoticeClosePositions[index].getX(), socialNoticeClosePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待1s
        robot.delay(1000);
    }

    private void clickNextAccount(Robot robot, AccountPosition nextAccountPosition) {
        // 移动鼠标到进入江湖
        robot.mouseMove(nextAccountPosition.getX(), nextAccountPosition.getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.7s
        robot.delay(700);
    }

    private void clickAccountMenu(Robot robot, int index) {
        //每组第一个账号就是对应的位置
        Map<Integer, List<AccountPosition>> accountsGroup = CurrentAccountPosition.getAccountsGroup();
        AccountPosition accountPosition = accountsGroup.get(index).get(0);

        // 移动鼠标到进入江湖
        robot.mouseMove(accountPosition.getX(), accountPosition.getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.7s
        robot.delay(700);
    }

    private void clickAccountLogin(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(accountLoginPositions[index].getX(), accountLoginPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.5s
        robot.delay(500);
    }

    /**选择下一个账户 并设置下一账户为当前账户*/
    private AccountPosition pickNextAndSetCurrentAccount(AtomicReference<AccountPosition> currentAccountPosition) {
        if(currentAccountPosition == null){
            CurrentAccountPosition.setGroupIndex(0);
            CurrentAccountPosition.setItemIndex(0);
            CurrentAccountPosition.setCurrentAccountPosition(new AtomicReference<>(AccountPosition.ACCOUNT_0));
            return AccountPosition.ACCOUNT_0;
        }else {
            return currentAccountPosition.get().getNextAndSetCurrentAccountPosition();
        }

    }

    /**点击进入江湖为*/
    private void clickJoinGameRole(Robot robot,int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(joinGameRoles[index].getX(), joinGameRoles[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待1s
        robot.delay(1000);
    }

    private void clickFirstRole(Robot robot, int index) {
        Map<Integer, List<RolePosition>> rolesGroup = CurrentRolePosition.getRolesGroup();
        RolePosition firstRole = rolesGroup.get(index).get(0);

        // 移动鼠标到进入江湖
        robot.mouseMove(firstRole.getX(), firstRole.getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.4s
        robot.delay(400);
    }

    /**点击进入江湖为*/
    private void clickJoinGameHome(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(joinGameHomes[index].getX(), joinGameHomes[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待1s
        robot.delay(1000);
    }

    private void clickActivityClose(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(activityClosePositions[index].getX(), activityClosePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.3s
        robot.delay(300);
    }

    /**点击弹窗的确认键*/
    private void clickVerifyBotton(Robot robot,int index) {
        // 移动鼠标到确认位
        robot.mouseMove(verifyPositions[index].getX(), verifyPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);

        robot.delay(300);
    }

    /**点击切换角色位*/
    private void clickTransAccountPosition(Robot robot, int index) {
        // 移动鼠标到切换角色位
        robot.mouseMove(transAccountPositions[index].getX(), transAccountPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    /**点击设置位*/
    private void clickSettingPosition(Robot robot,int index) {
        // 移动鼠标到设置位
        robot.mouseMove(settingPositions[index].getX(), settingPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时1.5s
        robot.delay(1500);
    }

    /**点击系统位*/
    private void clickSystemPositon(Robot robot,int index) {
        // 移动鼠标到系统位
        robot.mouseMove(systemPositions[index].getX(), systemPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    private void clickBlankPosition(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(blankPositions[index].getX(), blankPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.3s
        robot.delay(300);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.group = ProcessEnum.TRANS_ACCOUNT.getType();
        this.globleId = this.generateGlobleId();
    }
}
